<?php

namespace Framework;

use App\controllers\ErrorController;
use Framework\Middleware\Authorise;

class Router{
     protected $routes=[];


     /**
      *注册一条路由规则
      *
      *@param string $method
      *@param string $uri
      *@param array $middleware
      *@return void
      */

     private function registerRoute($method,$uri,$action,$middleware=[]){

          list($controller,$controllerMethod)=explode('@',$action);

          // inspectAndDie($controllerMethod);


          $this->routes[]=[
               'method'=>$method,
               'uri'=>$uri,
               'controller'=>$controller,
               'controllerMethod'=>$controllerMethod,
               'middleware'=>$middleware
          ];
     }

     /**
      * 添加一个GET路由
      *@param string $uri
      *@param string $controller
      *@param array $middleware
      *@return void
      */
      public function addGet($uri,$controller,$middleware=[]){
           $this->registerRoute('GET',$uri,$controller,$middleware);
      }

     /**
      * 添加一个POST路由
      *@param string $uri
      *@param string $controller
      *@param array $middleware
      *@return void
      */
      public function addPost($uri,$controller,$middleware=[]){
           $this->registerRoute('POST',$uri,$controller,$middleware);
      }

     /**
      * 添加一个PUT路由
      *@param string $uri
      *@param string $controller
      *@param array $middleware
      *@return void
      */
      public function addPut($uri,$controller,$middleware=[]){
           $this->registerRoute('PUT',$uri,$controller,$middleware);
      }

     /**
      * 添加一个DELETE路由
      *@param string $uri
      *@param string $controller
      *@param array $middleware
      *@return void
      */
      public function addDelete($uri,$controller,$middleware=[]){
           $this->registerRoute('DELETE',$uri,$controller,$middleware);
      }
      
      /**
       * 加载错误页面
       * @param int $httpCode
       * @return void
       */
      public function error($httpCode = 404){
           http_response_code($httpCode);
           loadView("error/$httpCode");
           exit;
      }


      /**
     * 执行路由
     * 
     * @param string $uri
     * 
     * @return void
     */
    public function route($uri){
     $requestMethod = $_SERVER['REQUEST_METHOD'];

     if($requestMethod === 'POST' && isset($_POST['_method'])){
          $requestMethod=strtoupper($_POST['_method']);
     }

     //拆分目前URI
     $uriSegments=explode('/',trim($uri,'/'));

     foreach($this->routes as $route){
         //拆分路由uri
         $routeSegments=explode('/',trim($route['uri'],'/'));
         $match=false;
         //检查拆分后的字符串片段数量是否匹配
               if(count($uriSegments) === count($routeSegments) && strtoupper($route['method'] === $requestMethod)){

                    $params=[];

                    $match=true;
                    
                    for($i=0;$i<count($uriSegments);$i++){
                         if ($routeSegments[$i] !== $uriSegments[$i] && !preg_match('/\{(.+?)\}/',$routeSegments[$i])){
                              $match=false;
                              break;
                         }
                         if(preg_match('/\{(.+?)\}/',$routeSegments[$i],$matches)){
                              $params[$matches[1]]=$uriSegments[$i];
                         }
                    }
               }
               if($match){

                    foreach($route['middleware'] as $middleware){
                         (new Authorise())->handle($middleware);
                    }
                    
                    $controller='App\\Controllers\\' . $route['controller'];
                    $controllerMethod=$route['controllerMethod'];

                    $controllerInstance = new $controller();
                    $controllerInstance->$controllerMethod($params);
                    return;
               }
          }
          ErrorController::notFound();
     }
}